package cn.lucky.thread.deadlock;

/**
 * @Author: jianglingpeng
 * @Date: 2020/9/23
 * @Description:
 *  死锁：当两个或者更多的线程(或进程)相互持有对方所需要的资源, 又不主动释放锁, 导致所有人都无法继续执行下去, 导致程序陷入无尽的阻塞, 这就是死锁.
 *  运行下面的例子会发现：
 *      Thread1的A方法获得了锁1,但是还需获取锁2
 *      Thread1的A方法获得了锁1和锁2
 *      Thread2的A方法获得了锁1,但是还需获取锁2
 *      Thread1的B方法获得了锁2,但是还需获取锁1
 *  在上面的运行结果中可以看出，当Thread2调用A方法时获得了锁1，还需要获得锁2，
 *  但此时Thread1获取到了CPU的调度，并且获得了锁2,还需要获得锁1。
 *  但此时锁1还被Thread2拿到，Thread2需要的锁2，被Thread1拿到，
 *  此时两个线程互相持有对方所需要的的资源，但又不主动释放锁，所以就会导致程序无止境的阻塞，造成死锁。
 *
 */
public class Deadlock {
    public static void main(String[] args) {
        DeadlockThread t1 = new DeadlockThread();
        new Thread(t1,"Thread1").start();
        new Thread(t1,"Thread2").start();
    }
}

class DeadlockThread implements Runnable{

    private final Object lock1 = new Object();
    private final Object lock2 = new Object();
    @Override
    public void run() {
        A();
        B();
    }

    private void A(){
        synchronized (lock1){
            System.out.println(Thread.currentThread().getName() + "的A方法获得了锁1,但是还需获取锁2");
            synchronized (lock2){
                System.out.println(Thread.currentThread().getName() + "的A方法获得了锁1和锁2");
            }
        }
    }

    private void B(){
        synchronized (lock2){
            System.out.println(Thread.currentThread().getName() + "的B方法获得了锁2,但是还需获取锁1");
            synchronized (lock1){
                System.out.println(Thread.currentThread().getName() + "的B方法获得了锁2和锁1");
            }
        }
    }
}